# Examen Interpretatie van Computerprogrammas juni 2023-2024

## 1: M-eval

Breidt M-eval uit met named let. Zorg ervoor dat de gegewone let blijft werken.

1) Implementeer alle predicaten en hulpfuncties die je nodig hebt om (named) lets te evalueren.
2) Implementeer als afgeleide functie
3) Implementeer met een "dedicated evaluator" procedure

## 2: Registermachine: M-eval

Registermachine die bepaalt of een gegeven getal een Harshad-getal is. Input telkens moet in h1, en output in res. Te gebruiken registers: res, cont, v1, v2.
*null?*, *deelbaar?*, *getal->cijferlijst*, *car*, *cdr*, en *+* zijn reeds geïmplementeerd.

Voorbeeld:
(is-harshad? 150): 1 + 5 + 0 moet 150/6 = true opleveren.

```scheme
(define (is-harshad? getal)
	(define (harshad-hulp cijferlijst resultaat)
		(if (null? cijferlijst)
			(deelbaar? getal resultaat)
			(harshad-hulp (cdr cijferlijst) (+ resultaat (car cijferlijst)))
		)
	)
	(harshad-hulp (getal->cijferlijst getal) 0)
)
```

## 3: Open vragen

Beantwoord kort maar bonding.

### A-eval

Is volgende Scheme-expressie een goede variant voor de *analyze-assignment*-procedure bij de analyzing evaluator? Motiveer.

```scheme
(define (analyze-assignment exp)
	(lambda (env)
		(set-variable-value! 
			(assignment-variable exp)
			(eval (assignment-value exp) env)
			env
		)
		'ok
	)
)
```

### Lazy Eval

Voorspel de output van volgende expressie. Motiveer.

```scheme
(begin
	(define x 1)
	(define (f a) a)
	(define (add! x a) (set! x (+ x a)) x)
	(define y (f (if (> 6 5) (add! x 1) (add! x 2))))
	x
)
```

### Garbage collection

Geef twee voorbeelden van een Scheme-expressie die niet langer te bereiken waarden in het geheugen achterlaat; gebruik *set!*/*set-car!*/*set-cdr!*/... in het eerste voorbeeld.

### EC Eval

?

### Compilatie

Achterhaal welke argumenten gebruikt zijn voor de *compile*-procedure, gegeven volgende gecompileerde expressie

```scheme
?
```

## 4: Logisch programmeren

### Query

Gegeven lijst van feiten

```scheme
(werf <werf> <taak>)
(werknemer <werknemer> <taak>)
```

Geef een querry die alle werven met taken teruggeeft waarvoor geen werknemer is.

### Regels

Gegeven volgende regels

```scheme
(assert! (rule (een-regel (?a) ?x (?a))))

(assert! (rule (een-regel (?a . (?b . ?c)) ?x (?a . (?x . ?r)))
               (een-regel (?b . ?c) ?x ?r)))
```

Naar welke awarde evalueert

```scheme
(een-regel (1 2 3 4) 5 ?x)
```
